// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_MAC_SCOPED_AEDESC_H_
#define BASE_MAC_SCOPED_AEDESC_H_

#import <CoreServices/CoreServices.h>

#include "base/macros.h"

namespace base {
namespace mac {

    // The ScopedAEDesc is used to scope AppleEvent descriptors.  On creation,
    // it will store a NULL descriptor.  On destruction, it will dispose of the
    // descriptor.
    //
    // This class is parameterized for additional type safety checks.  You can use
    // the generic AEDesc type by not providing a template parameter:
    //  ScopedAEDesc<> desc;
    template <typename AEDescType = AEDesc>
    class ScopedAEDesc {
    public:
        ScopedAEDesc()
        {
            AECreateDesc(typeNull, NULL, 0, &desc_);
        }

        ~ScopedAEDesc()
        {
            AEDisposeDesc(&desc_);
        }

        // Used for in parameters.
        operator const AEDescType*()
        {
            return &desc_;
        }

        // Used for out parameters.
        AEDescType* OutPointer()
        {
            return &desc_;
        }

    private:
        AEDescType desc_;

        DISALLOW_COPY_AND_ASSIGN(ScopedAEDesc);
    };

} // namespace mac
} // namespace base

#endif // BASE_MAC_SCOPED_AEDESC_H_
